/**
 * Serializer
 * 坐标均相对于编辑窗口    坐标单位：mm
 */

if(typeof (module) !="undefined"){
    module.exports = Serializer; // 继承第1/2步（基类）：导出

    var FColorBase = require('../color/FColorBase');
    var Effect = require('../common/Effect');
}


function Serializer() {
    this.ct = Serializer.prototype.CLASS_TYPE_PRINTOBJ;// class-type   						--新增
    this.colorMode = FColorBase.prototype.COLOR_MODE_RGB;               // 颜色模式，需要在Template解析时给所有打印对象赋值
}
// 类型定义
Serializer.prototype.CLASS_TYPE_PRINTOBJ = 0;// PrintObj类型
Serializer.prototype.CLASS_TYPE_TEXTOBJ = 1;// TextObj类型
Serializer.prototype.CLASS_TYPE_FILEOBJ = 2;// FileObj类型
Serializer.prototype.CLASS_TYPE_IMAGEOBJ = 3;// ImageObj类型						
Serializer.prototype.CLASS_TYPE_GRAPHOBJ = 4;// GraphObj类型
Serializer.prototype.CLASS_TYPE_TABLEOBJ = 5;// TableObj类型
Serializer.prototype.CLASS_TYPE_GROUPOBJ = 6;// GroupObj类型
Serializer.prototype.CLASS_TYPE_FRAMEOBJ = 7;// FrameObj类型
Serializer.prototype.CLASS_TYPE_SUBTEMPLATEOBJ = 8;// SubTemplateObj类型
Serializer.prototype.CLASS_TYPE_TEXTTABLEOBJ = 9;// TextTable类型
Serializer.prototype.CLASS_TYPE_PRINTPAGE = 10;// PrintPage类型
Serializer.prototype.CLASS_TYPE_LAYEROBJ = 11; // LayerObj类型
Serializer.prototype.CLASS_TYPE_PDFOBJ = 20;// PDFObj类型

// 从json对象(注意不是json字符串)中解析
Serializer.prototype.fromJson = function (jsonObj, versionId) {
    this.ct = jsonObj.ct;
}
// 转成json字符串
Serializer.prototype.toJson = function () {
    var ret = "{";
    ret += ('"ct":' + this.ct);
    ret += "}";
    return ret;
}

/**
 * 将对象添加到PDF中
 * @param doc  PDFDocument结构
 * @param info  对象结构，属性如下：
 *                  docOriginX  文档的新原点 在原始原点的 坐标
 *                  docOriginY  文档的新原点 在原始原点的 坐标
 *                  w   文档宽度
 *                  h   文档高度
 */
Serializer.prototype.addToPdf = function (doc, info) {

}

/**
 * 保存上下文环境，并将坐标系原点平移到当前对象的左上角，并旋转
 * @param doc  PDFDocument结构
 * @param info  对象结构，属性如下：
 *                  docOriginX  文档的新原点 在原始原点的 坐标
 *                  docOriginY  文档的新原点 在原始原点的 坐标
 *                  clip        （在GraphObj对象中有效）true表示剪切蒙版，false表示普通对象
 */
Serializer.prototype.before = function (doc, info) {
    // 保存全局环境
    doc.save();

    // 平移
    info.docOriginX += this.x;
    info.docOriginY += this.y;
    //doc.translate(info.docOriginX, info.docOriginY);
    doc.translate(this.x, this.y);
    doc.rotate(this.an);
}
/**
 * 还原上下文环境
 * @param doc  PDFDocument结构
 * @param info  对象结构，属性如下：
 *                  docOriginX  文档的新原点 在原始原点的 坐标
 *                  docOriginY  文档的新原点 在原始原点的 坐标
 *                  clip        （在GraphObj对象中有效）true表示剪切蒙版，false表示普通对象
 */
Serializer.prototype.after = function (doc, info) {
    // 还原全局环境
    doc.restore();
    info.docOriginX -= this.x;
    info.docOriginY -= this.y;
}

// 取得子模板对象(返回subTemplateObj数组)
Serializer.prototype.getSubTemplateObj = function (key) {
    return new Array();
}

// 根据fill  和stroke  等信息，填充doc的上下文环境
// 参数：
//      doc：创建pdf的doc对象
//      fill：填充色，可能是FColorBase的派生类对象
//      stroke：描边色，可能是FColorBase的派生类对象
//      strokeWidth：描边宽度
//      opacity：平网透明度（如果是渐变，其透明度包含在FGradient中）
//      svgPath：路径
Serializer.prototype.drawSvgPath = function (doc, fill, stroke, strokeWidth, lineCap, lineJoin, miterLimit, opacity, svgPath) {
    if (fill) {
        // 存在填充
        if (fill.type == FColorBase.prototype.TYPE_COLOR) {
            // 如果填充是平网色
            var fillClr = this.colorMode == FColorBase.prototype.COLOR_MODE_RGB ? fill.toPDFKitRGBArray() : fill.toPDFKitCMYKArray();
            doc.fillColor(fillClr);
            doc.opacity(this.al);
            doc.path(svgPath).fill('non-zero');
        } else if (fill.type == FColorBase.prototype.TYPE_GRADIENT) {
            // 如果填充是渐变色
            if (fill.line) {
                // 线性渐变
                var paras = fill.PDFKitGradientParas();
                var grad = doc.linearGradient(paras[0], paras[1], paras[2], paras[3]);
                for (var k = 0; k < fill.colors.length; k++) {
                    var clr = fill.colors[k].toPDFKitRGBArray(); // PDFkit
                    var alphas = fill.alphas[k];
                    var ratio = fill.ratios[k] / 0xFF;
                    grad.stop(ratio, clr, alphas);
                }
                doc.path(svgPath).fill(grad);

            } else {
                // 圆形渐变
                var paras = fill.PDFKitGradientParas();
                var grad = doc.radialGradient(paras[0], paras[1], paras[2], paras[3], paras[4], paras[5]);
                for (var k = 0; k < fill.colors.length; k++) {
                    var clr = fill.colors[k].toPDFKitRGBArray();
                    var alphas = fill.alphas[k];
                    var ratio = fill.ratios[k] / 0xFF;
                    grad.stop(ratio, clr, alphas);
                }
                doc.path(svgPath).fill(grad);

            }
        }
    }

    if (stroke) {
        // 描边
        var strokeClr = this.colorMode == FColorBase.prototype.COLOR_MODE_RGB ? stroke.toPDFKitRGBArray() : stroke.toPDFKitCMYKArray();
        var type = Effect.prototype.getPDFKitLineJoinName(lineJoin);
        if (lineJoin == Effect.prototype.LINE_JOIN_MITER) {
            doc.strokeColor(strokeClr)
                .lineWidthFunc(strokeWidth)
                .lineCapFunc(Effect.prototype.getPDFKitLineCapName(lineCap))
                .lineJoinFunc(type)
                .miterLimitFunc(miterLimit)
                .opacity(opacity);
            doc.path(svgPath).stroke();
        }
        else {
            doc.strokeColor(strokeClr)
                .lineWidthFunc(strokeWidth)
                .lineCapFunc(Effect.prototype.getPDFKitLineCapName(lineCap))
                .lineJoinFunc(type)
                .opacity(opacity);
            doc.path(svgPath).stroke();
        }
    }


}
